package com.example.springboottaskscheduler.utils;
import java.util.Objects;
import java.util.concurrent.ScheduledFuture;
/**
 * Created by IntelliJ IDEA2022.3.2
 * @Author: Tenghw
 * @Date: 2023/05/07  18:49
 * @Description:
 *  CronTaskFuture类中使用的是ScheduledFuture对象,来表示定时任务的执行结果。
 *  最后ps：也可以不要这个记录类，直接缓存ScheduledFuture对象。用来记录单独的Future、定时任务注册任务后产生的执行结果
 */
public class CronTaskFuture {

    /**
     * 每个线程一个副本
     * 经过测试这里不能使用ThreadLocal
     */
    //private static final ThreadLocal<ScheduledFuture<?>> THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 使用建议：
     *      CronTaskFuture类中使用ScheduledFuture对象，来表示定时任务的执行结果。
     *      ScheduledFuture对象是线程安全的，因此不需要使用volatile或ThreadLocal来保证多线程同步。
     *      如果需要在多线程中使用线程本地变量，可以使用ThreadLocal。
     *      因此，建议在CronTaskFuture类中使用ScheduledFuture对象，而不是使用volatile或ThreadLocal。
     *      另外，如果需要在Spring容器销毁时，执行一些清理操作，可以实现DisposableBean接口，并在destroy()方法中进行清理操作。
     */
    public ScheduledFuture<?> future;
//    public volatile ScheduledFuture<?> future;
//    public void setThreadLocal(ScheduledFuture<?> future){
//        THREAD_LOCAL.set(future);
//    }

    /**
     * 取消当前定时任务
     */
    public void cancel() {
        try {
//            ScheduledFuture<?> future = THREAD_LOCAL.get();
            ScheduledFuture<?> future = this.future;
            if (Objects.nonNull(future)) {
                future.cancel(true);
            }
        } catch (Exception e) {
            throw new RuntimeException("销毁定时任务失败！");
        } finally {
//            THREAD_LOCAL.remove();
        }
    }
}
